package com.jqq.reflection;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @author 姬倩倩
 * @version 1.0
 */
public class Reflection01 {
    public static void main(String[] args) throws Exception {
        //1.使用Properties读取配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\re.properties"));
        String classfullpath = properties.get("classfullpath").toString();
        String methodName = properties.get("method").toString();
        //2.使用反射机制
        //(1)加载类，返回Class类型的对象
        Class cls = Class.forName(classfullpath);
        //(2)通过cls得到加载的com.jqq.cat的对象实例
        Object o = cls.newInstance();
        System.out.println(o.getClass());//运行类型
        //(3)通过cls得到加载的类com.jqq.Cat 的方法对象
        //  即在反射中，可以把方法视为对象(万物皆对象)
        Method method1 = cls.getMethod(methodName);
        //(4)通过method1调用方法，即通过方法对象来实现方法
        method1.invoke(o);//传统方法：对象.方法，反射机制：方法.invoke(对象)

        //java.lang.reflect.Field：代表类的成员变量，Field对象表示某个类的成员变量
        //得到name字段
        //getField不能得到私有属性
        Field nameField = cls.getField("age");
        System.out.println(nameField.get(o));//传统：对象.成员变量 反射：成员变量对象.get(对象)

        //java.lang.reflect.Constructor：代表类的构造方法，Constructor对象表示构造器
        Constructor constructor = cls.getConstructor();//()可以指定构造器参数类型
        //不写默认无参构造器
        System.out.println(constructor);

        Constructor constructor2 = cls.getConstructor(String.class);//String.class是String类的class对象
        System.out.println(constructor2);
    }
}
